#include "../include/pantalla.h"
#include "../include/kernel.h"
#include "../include/interrupciones.h"
#include "../include/mouse.h"
#include "../include/stdio.h"

void inicializarPantalla()
{
	descursor();	// deshabilito el cursor de hardware ya que se manejara por software

	pantalla=open(STDOUT);

	pantalla->dir=(char *) 0xb8000; // cargo el file descriptor de la pantalla
	pantalla->cursorW=0;

    clrscr();

    // seteo valores iniciales para variables que controlan el salvapantallas
    asignarEsperaSalvaPantalla(30);
	timerSalvaPantalla=0;
	salvaPantallaActivo=0;
}

/*
 * Deshabilita el cursor de hardware
 */
void descursor()
{
	outportb(0x3D4,0x0A);
	outportb(0x3D5,0x20);
}

void asignarEsperaSalvaPantalla(int segundos)
{
	long aux=((long) segundos)*1000;		// transforma el numero en segundos a la escala del contador
	esperaSalvaPantalla=aux/FREQ_TIMERTICK;	// entero del timertick
}

/*
 * Borra la pantalla y situa el cursor al inicio
 */
void clrscr()
{
	int i;
	pantalla->cursorW=0;
	for(i=0;i<(FILAS*COLUMNAS);i++)
		putchar(' ');
	pantalla->cursorW=0;
}

/*
 * Realiza un scroll de la pantalla eliminando la primera fila, poniendo la ultima en blanco y
 * situando el cursor al inicio de la ultima fila
 */
void scroll()
{
	int cursoraux=COLUMNAS*2;

	if (posSeleccionInicial.y!=-1) 	// desplazo la seleccion del mouse una fila hacia arriba
		posSeleccionInicial.y--;
	if (posSeleccionFinal.y!=-1)
		posSeleccionFinal.y--;

	pantalla->cursorW=0;

	if (!mouseEnSeleccion())		// borra el mouse para luego redibujarlo,
		unsetMouse();				// salvo que este dentro de la seleccion

	// traslada todos los caracteres una fila para arriba
	while (cursoraux!=COLUMNAS*FILAS*2)
		pantalla->dir[pantalla->cursorW++]=pantalla->dir[cursoraux++];
	// imprime en blanco la ultima
	while (pantalla->cursorW!=COLUMNAS*FILAS*2)
		putchar(' ');

	pantalla->cursorW=(2*COLUMNAS*(FILAS-1));	// situa el cursor al inicio de la ultima fila

	setMouse();						// redibuja el mouse
}

void prompt()
{
	printf("Ingrese comando: ");
	imprimirCursor();
}

/*
 * Dibuja un cursor (guion bajo titilando) en la posicion logica del cursor
 */
void imprimirCursor()
{
	if (pantalla->cursorW+2!=COLUMNAS*FILAS*2)
	{
		unsetMouse();
		pantalla->dir[pantalla->cursorW]='_';
		pantalla->dir[pantalla->cursorW+1]=WHITE_TXT | BLINK;
		setMouse();
		setSeleccionMouse();
	}
}

/*
 * Reinicia el contador del salvapantalla y restaura la pantalla en caso de que este activo.
 * Devuelve 1 si el salvapantalla estaba activo y 0 en otro caso.
 */
int reactivarSalvaPantalla()
{
	int aux;

	timerSalvaPantalla=0;							// reinicia el contador

	if (salvaPantallaActivo==1)
	{
		salvaPantallaActivo=0;

		for(aux=0;aux<COLUMNAS*FILAS*2;aux++)		// recorre toda la pantalla y la restaura
		{											// desde el buffer del salvapantalla.
			pantalla->dir[aux]=salvaPantalla[aux];
			pantalla->cursorW=salvaCursorPantalla;	// restaura el cursor en donde estaba
		}
		return 1;
	}
	else
		return 0;
}

/*
 * Procesa la interrupcion del timertick (este codigo se ejecuta cada 55ms)
 */
void procTimerTick()
{
	int aux;

	if (salvaPantallaActivo==0)		// Si el salvapantalla esta activo se ignora la interrupcion
	{
		timerSalvaPantalla++;		// Si no esta activo, se aumenta el contador

		if (timerSalvaPantalla>=esperaSalvaPantalla)	// si se supera el tiempo de espera
		{												// se guarda la pantalla en el buffer,
			salvaPantallaActivo=1;						// se guarda la posicion del cursor
			for(aux=0;aux<COLUMNAS*FILAS*2;aux++)		// y se muestra el salvapantalla
				salvaPantalla[aux]=pantalla->dir[aux];	// en este caso una pantalla en blanco
														// con un texto
			salvaCursorPantalla=pantalla->cursorW;
			clrscr();
			printf("\n\n\n\n\n\n");
			printf("                       ESTOY EN EL SALVAPANTALLAS");
		}
	}
}
